#!/bin/bash

# 设置 SSL 证书自动更新的定时任务
# 适用于 CentOS 8 系统

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CRON_LOG="$SCRIPT_DIR/logs/cron.log"

# 检查命令行参数
FORCE_MODE=false
if [ "$1" = "--force" ]; then
    FORCE_MODE=true
    echo "强制模式：将重新设置所有 SSL 证书定时任务"
fi

# 创建日志目录
mkdir -p "$SCRIPT_DIR/logs"

echo "设置 SSL 证书自动更新定时任务..."

# 检查脚本是否存在
if [ ! -f "$SCRIPT_DIR/ssl_auto_renew.sh" ]; then
    echo "错误: ssl_auto_renew.sh 脚本不存在"
    exit 1
fi

# 给脚本添加执行权限
chmod +x "$SCRIPT_DIR/ssl_auto_renew.sh"

# 创建 crontab 任务
# 每天凌晨 2 点检查证书状态并自动续期
# 每周日凌晨 3 点进行详细检查（包含日志清理）

CRON_ENTRIES="
# SSL 证书自动更新任务
# 每天凌晨 2 点检查证书状态并自动续期
0 2 * * * $SCRIPT_DIR/ssl_auto_renew.sh apply auto >> $CRON_LOG 2>&1

# 每周日凌晨 3 点进行详细检查（包含日志清理）
0 3 * * 0 $SCRIPT_DIR/ssl_auto_renew.sh check >> $CRON_LOG 2>&1 && find $SCRIPT_DIR/logs -name '*.log' -mtime +30 -delete
"

# 检查是否已经存在 SSL 证书定时任务
echo "检查是否已存在 SSL 证书定时任务..."
existing_ssl_tasks=$(crontab -l 2>/dev/null | grep "ssl_auto_renew.sh" | wc -l)

if [ "$existing_ssl_tasks" -gt 0 ]; then
    echo "警告: 检测到已存在 $existing_ssl_tasks 个 SSL 证书定时任务"
    echo "当前 SSL 证书相关任务："
    crontab -l 2>/dev/null | grep "ssl_auto_renew.sh"
    echo ""
    
    if [ "$FORCE_MODE" = true ]; then
        echo "强制模式：直接删除现有任务并重新设置"
        crontab -l 2>/dev/null | grep -v "ssl_auto_renew.sh" | crontab -
    else
        # 检查是否是完全相同的任务
        if crontab -l 2>/dev/null | grep -q "0 2 \* \* \*.*ssl_auto_renew.sh apply auto" && \
           crontab -l 2>/dev/null | grep -q "0 3 \* \* 0.*ssl_auto_renew.sh check"; then
            echo "检测到相同的定时任务已存在，无需重复添加"
            echo "如需重新设置，请使用: $0 --force"
            echo "操作已取消"
            exit 0
        fi
        
        read -p "是否要重新设置？这将删除现有的 SSL 证书任务并添加新的任务 (y/N): " confirm
        if [[ $confirm != [yY] ]]; then
            echo "操作已取消"
            exit 0
        fi
        
        # 删除现有的 SSL 证书任务
        echo "删除现有的 SSL 证书定时任务..."
        crontab -l 2>/dev/null | grep -v "ssl_auto_renew.sh" | crontab -
    fi
fi

# 备份现有的 crontab
echo "备份现有 crontab..."
mkdir -p "$SCRIPT_DIR/crontab_backup"
crontab -l > "$SCRIPT_DIR/crontab_backup/crontab_backup_$(date +%Y%m%d_%H%M%S).txt" 2>/dev/null

# 添加新的定时任务
echo "添加 SSL 证书自动更新定时任务..."
(crontab -l 2>/dev/null; echo "$CRON_ENTRIES") | crontab -

# 验证 crontab 设置
echo "当前 crontab 设置:"
crontab -l

echo ""
echo "定时任务设置完成！"
echo "SSL 证书将在以下时间自动检查/更新："
echo "- 每天凌晨 2:00 - 检查证书状态并自动续期"
echo "- 每周日凌晨 3:00 - 详细检查并清理30天前的日志"
echo ""
echo "日志文件位置: $CRON_LOG"
echo ""
echo "手动测试命令："
echo "  $SCRIPT_DIR/ssl_auto_renew.sh check        # 检查证书状态"
echo "  $SCRIPT_DIR/ssl_auto_renew.sh apply auto   # 自动判断申请或续期"
echo "  $SCRIPT_DIR/ssl_auto_renew.sh apply new    # 申请新证书"
echo "  $SCRIPT_DIR/ssl_auto_renew.sh apply renew  # 续期现有证书"
echo "  $SCRIPT_DIR/ssl_auto_renew.sh force-renew  # 强制续期（测试用）"
echo ""
echo "脚本使用说明："
echo "  $0           # 正常设置（会检查重复）"
echo "  $0 --force   # 强制重新设置（忽略重复检查）"
